import {
  HomeOutlined,
  LinkOutlined,
  PieChartFilled,
  ProductOutlined,
  ProjectOutlined,
  PropertySafetyOutlined,
  SettingFilled,
  UnorderedListOutlined,
} from "@ant-design/icons";
import type { Settings as LayoutSettings } from "@ant-design/pro-components";
import { SettingDrawer } from "@ant-design/pro-components";
import type { RequestConfig, RunTimeLayoutConfig } from "@umijs/max";
import { history } from "@umijs/max";
import { AvatarDropdown, AvatarName, SelectLang } from "@/components";
import {
  getMenu,
  currentUser as queryCurrentUser,
} from "@/services/ant-design-pro/api";
import defaultSettings from "../config/defaultSettings";
import { errorConfig } from "./requestErrorConfig";
import "@ant-design/v5-patch-for-react-19";
import type {
  JSXElementConstructor,
  ReactElement,
  ReactNode,
  ReactPortal,
} from "react";

// 把字符串转成真正的 React 组件

const getMenuIconByPath = (path: string) => {
  // console.log("path", path);
  path = path.replace(/^\//, "");
  switch (path) {
    case "system":
      return <SettingFilled />;
    case "sale":
      return <PropertySafetyOutlined />;
    case "user":
      return <PieChartFilled />;
    case "product":
      return <ProductOutlined />;
    case "link":
      return <LinkOutlined />;
    case "project":
      return <ProjectOutlined />;
  }
  return <UnorderedListOutlined />;
};

const isDev = process.env.NODE_ENV === "development" || process.env.CI;
const loginPath = "/user/login";

/**
 * @see https://umijs.org/docs/api/runtime-config#getinitialstate
 * */
export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: API.CurrentUser;
  loading?: boolean;
  fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      const msg = await queryCurrentUser({
        skipErrorHandler: true,
      });
      const { user = {}, permissions } = msg as any;

      return { ...user, userid: user.userId, name: user.nickName, permissions };
    } catch (_error) {
      console.log("fetch user info error:", _error);
      // history.push(loginPath);
    }
    return undefined;
  };
  // 如果不是登录页面，执行
  const { location } = history as any;
  if (
    ![loginPath, "/user/register", "/user/register-result"].includes(
      location.pathname
    )
  ) {
    const currentUser = await fetchUserInfo();
    return {
      fetchUserInfo,
      currentUser,
      settings: defaultSettings as Partial<LayoutSettings>,
    };
  }
  return {
    fetchUserInfo,
    settings: defaultSettings as Partial<LayoutSettings>,
  };
}
//
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({
  initialState,
  setInitialState,
}) => {
  return {
    menu: {
      request: async () => {
        const { code, data = [] } = await getMenu();

        if (code !== 200 || Array.isArray(data) === false) {
          return [];
        }
        //如果item.children改为routes
        const resetData = (list: any[]) => {
          return list
            .map((item: any) => {
              const { meta, path } = item || {};
              const { title } = meta || {};
              const name = title || item.name || item.menuName || title || "00";

              const newItem = {
                ...item,
                name,
                hidden: item.hidden || meta?.hidden,
                icon: getMenuIconByPath(
                  path?.startsWith("http") ? "link" : item.path
                ),
              };

              if (Array.isArray(item.children)) {
                newItem.routes = resetData(item.children);
                delete newItem.children;
              }
              return newItem;
            })
            .filter((item) => !item.hidden); //过滤item.hidden===true
        };
        const resultData = resetData(data);
        // console.log(data, resultData);
        //result data 插入一个菜单home
        resultData.unshift({
          name: "home",
          icon: <HomeOutlined />,
          path: "/home",
          component: "./home",
        });
        return resultData;
      },
    },
    actionsRender: () => [
      // <Question key="doc" />,
      <SelectLang key="SelectLang" />,
    ],
    avatarProps: {
      src: initialState?.currentUser?.avatar,
      title: <AvatarName />,
      render: (
        _: any,
        avatarChildren:
          | string
          | number
          | bigint
          | boolean
          | ReactElement<unknown, string | JSXElementConstructor<any>>
          | Iterable<ReactNode>
          | ReactPortal
          | Promise<
              | string
              | number
              | bigint
              | boolean
              | ReactPortal
              | ReactElement<unknown, string | JSXElementConstructor<any>>
              | Iterable<ReactNode>
              | null
              | undefined
            >
          | null
          | undefined
      ) => {
        return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
      },
    },
    waterMarkProps: {
      content: initialState?.currentUser?.name,
    },
    // footerRender: () => <Footer />,
    onPageChange: () => {
      const { location } = history as any;
      // console.log(initialState?.currentUser);
      // 如果没有登录，重定向到 login
      if (!initialState?.currentUser?.name && location.pathname !== loginPath) {
        history.push(loginPath);
      }
    },
    // bgLayoutImgList: [
    //   {
    //     src: "https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr",
    //     left: 85,
    //     bottom: 100,
    //     height: "303px",
    //   },
    //   {
    //     src: "https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr",
    //     bottom: -68,
    //     right: -45,
    //     height: "303px",
    //   },
    //   {
    //     src: "https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr",
    //     bottom: 0,
    //     left: 0,
    //     width: "331px",
    //   },
    // ],
    // links: isDev
    //   ? [
    //       <Link key="openapi" to="/umi/plugin/openapi" target="_blank">
    //         <LinkOutlined />
    //         <span>OpenAPI 文档</span>
    //       </Link>,
    //     ]
    //   : [],
    menuHeaderRender: undefined,
    // 自定义 403 页面
    // unAccessible: <div>unAccessible</div>,
    // 增加一个 loading 的状态
    childrenRender: (children) => {
      // if (initialState?.loading) return <PageLoading />;
      return (
        <>
          {children}
          {isDev && (
            <SettingDrawer
              disableUrlParams
              enableDarkTheme
              settings={initialState?.settings}
              onSettingChange={(settings) => {
                setInitialState((preInitialState) => ({
                  ...preInitialState,
                  settings,
                }));
              }}
            />
          )}
        </>
      );
    },
    ...initialState?.settings,
  };
};

/**
 * @name request 配置，可以配置错误处理
 * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
 * @doc https://umijs.org/docs/max/request#配置
 */
export const request: RequestConfig = {
  baseURL: "/",
  ...errorConfig,
};
